#include "comm.hpp"

int main()
{
  Init init; // 创建管道，是为了同步通信
  // 1.创建共享内存
  int shmid = CreateShm();
  // 2.与当前进程建立连接
  char *shmaddr = (char *)shmat(shmid, nullptr, 0);
  // 3.通信过程
  // ipc code 这里
  // 一旦有人把数据写到共享内存中,就能立刻看到了
  // 不需要不需要通过系统调用就可以看到数据了

  int fd = open(FIFO_FILE, O_RDONLY); // 只读的方式打开管道，等待写入方打开，自己才会打开文件，向后执行，open阻塞了
  if (fd < 0)
  {
    log(Fatal, "error string :%s,error code:%d", strerror(errno), errno);
    exit(FIFO_OPEN_ERR);
  }

  struct shmid_ds shmds; // 共享内存的数据结构
  while (true)
  {
    // 通信过程
    char c;
    ssize_t s = read(fd, &c, 1); // 读到数据后才会进行共享内存的访问
    if (s < 0)
      break;
    else if (s == 0)
      break;
    cout << "client say@ " << shmaddr << endl; // 直接访问共享内存
    sleep(1);
    shmctl(shmid, IPC_STAT, &shmds);                    // 控制共享内存
    cout << "shm size:" << shmds.shm_segsz << endl;     // 共享内存的大小
    cout << "shm nattch:" << shmds.shm_nattch << endl;  // 与该共享内存连接的进程
    printf("shm key:0x%x\n", shmds.shm_perm.__key);     // 打印标识
    cout << "shm mode:" << shmds.shm_perm.mode << endl; // 打印权限码
  }
  // 4.断开进程与共享内存的联系
  shmdt(shmaddr);
  // 5.删除共享内存
  shmctl(shmid, IPC_RMID, nullptr);
  close(fd);
  return 0;
}